package com.yc.framework.manager.factory;

import com.yc.common.constant.Constants;
import com.yc.common.utils.LogUtil;
import com.yc.common.utils.spring.SpringUtil;
import com.yc.common.utils.WebUtil;
import com.yc.common.utils.ip.AddressUtil;
import com.yc.system.domain.SysLog;
import com.yc.system.service.ISysLogService;
import eu.bitwalker.useragentutils.UserAgent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;
import java.util.TimerTask;

/**
 * 异步工厂（产生任务用）
 *
 * @Author YanChen
 * @Date 2025/4/12 22:40
 **/
public class AsyncFactory {
    private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user");

    /**
     * 记录登录信息
     *
     * @param username 用户名
     * @param status   状态
     * @param message  消息
     * @param args     列表
     * @return 任务task
     */
    public static TimerTask recordLoginInfo(final String username, final String status, final String message,
                                            final Object... args) {
        final String ip = WebUtil.getIpAddr();
        final UserAgent userAgent = UserAgent.parseUserAgentString(WebUtil.getUserAgent());

        return new TimerTask() {
            @Override
            public void run() {
                String address = AddressUtil.getRealAddressByIP(ip);
                StringBuilder s = new StringBuilder();
                s.append(LogUtil.getBlock(ip));
                s.append(address);
                s.append(LogUtil.getBlock(username));
                s.append(LogUtil.getBlock(status));
                s.append(LogUtil.getBlock(message));
                // 打印信息到日志
                sys_user_logger.info(s.toString(), args);

                // 获取客户端操作系统
                String os = userAgent.getOperatingSystem().getName();
                // 获取客户端浏览器
                String browser = userAgent.getBrowser().getName();

                // 封装对象
                SysLog logInfo = new SysLog();
                logInfo.setUsername(username);
                logInfo.setIp(ip);
                logInfo.setLocation(address);
                logInfo.setRequestMethod("POST");
                logInfo.setResult(message);
                logInfo.setModule("系统登录");
                // 设置请求URL和方法
                logInfo.setRequestUrl(WebUtil.getRequestUrl());
                logInfo.setMethod("login");
                logInfo.setCreateTime(new Date());

                // 根据状态设置登录类型
                if (Constants.LOGIN_SUCCESS.equals(status)) {
                    logInfo.setType(5); // 登录
                    logInfo.setStatus(0); // 正常
                    logInfo.setDescription("用户登录成功");
                } else {
                    logInfo.setType(5); // 登录
                    logInfo.setStatus(1); // 异常
                    logInfo.setDescription("登录失败");
                    logInfo.setErrorMsg(message);
                }

                // 插入数据
                SpringUtil.getBean(ISysLogService.class).insertSysLogInfo(logInfo);
            }
        };
    }

    /**
     * 记录登出信息
     *
     * @param username 用户名
     * @param status   状态
     * @param message  消息
     * @return 任务task
     */
    public static TimerTask recordLogoutInfo(final String username, final String status, final String message,
                                             final Object... args) {
        final String ip = WebUtil.getIpAddr();
        final UserAgent userAgent = UserAgent.parseUserAgentString(WebUtil.getUserAgent());

        return new TimerTask() {
            @Override
            public void run() {
                String address = AddressUtil.getRealAddressByIP(ip);
                StringBuilder s = new StringBuilder();
                s.append(LogUtil.getBlock(ip));
                s.append(address);
                s.append(LogUtil.getBlock(username));
                s.append(LogUtil.getBlock(status));
                s.append(LogUtil.getBlock(message));
                // 打印信息到日志
                sys_user_logger.info(s.toString(), args);

                // 获取客户端操作系统
                String os = userAgent.getOperatingSystem().getName();
                // 获取客户端浏览器
                String browser = userAgent.getBrowser().getName();

                // 封装对象
                SysLog logInfo = new SysLog();
                logInfo.setUsername(username);
                logInfo.setIp(ip);
                logInfo.setLocation(address);
                logInfo.setRequestMethod("POST");
                logInfo.setResult(message);
                logInfo.setModule("系统登出");
                // 设置请求URL和方法
                logInfo.setRequestUrl(WebUtil.getRequestUrl());
                logInfo.setMethod("logout");
                logInfo.setCreateTime(new Date());

                // 根据状态设置登出类型
                if (Constants.LOGOUT.equals(status)) {
                    logInfo.setType(6); // 登出
                    logInfo.setStatus(0); // 正常
                    logInfo.setDescription("用户退出系统");
                } else {
                    logInfo.setType(5); // 登录
                    logInfo.setStatus(1); // 异常
                    logInfo.setDescription("登录失败");
                    logInfo.setErrorMsg(message);
                }

                // 插入数据
                SpringUtil.getBean(ISysLogService.class).insertSysLogInfo(logInfo);
            }
        };
    }

    /**
     * 操作日志记录
     *
     * @param operationLog 操作日志信息
     * @return 任务task
     */
    public static TimerTask recordOperationLog(final SysLog operationLog) {
        return new TimerTask() {
            @Override
            public void run() {
                // 远程查询操作地点
                operationLog.setLocation(AddressUtil.getRealAddressByIP(operationLog.getIp()));
                SpringUtil.getBean(ISysLogService.class).insertSysLogInfo(operationLog);
            }
        };
    }
}